package cn.edu.cug.cs.gtl.docsrv.txt.dao.impl;

import cn.edu.cug.cs.gtl.docsrv.Managers;
import cn.edu.cug.cs.gtl.docsrv.txt.TxtManager;
import cn.edu.cug.cs.gtl.docsrv.txt.dao.TxtDao;
import cn.edu.cug.cs.gtl.mybatis.mapper.txt.TxtAll;
import cn.edu.cug.cs.gtl.mybatis.mapper.txt.TxtAll;
import cn.edu.cug.cs.gtl.mybatis.mapper.txt.TxtCatalog;
import cn.edu.cug.cs.gtl.mybatis.metadata.TxtUtils;
import cn.edu.cug.cs.gtl.protos.Document;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@Component
public class TxtDaoImpl implements TxtDao {
    TxtManager txtManager = null;
    public TxtDaoImpl(){ super(); }
    /**
     服务编号：7001
     服务名称：addTxt
     功能描述：单个本地Txt文件入库
     接口描述： /api/txt/addTxt
     传入参数：
     TxtAll  txt；前端传入TxtAll的JSON对象
     返回值：
     成功返回true , 否则返回false
     调用示例：
     * *@param txtAll
     */
    @Override
    public void addTxt(TxtAll txtAll) {
        if(txtManager==null)
            txtManager= Managers.getTxtManager();
        txtManager.insert(txtAll);
    }

    /**
     服务编号：9002
     服务名称：addTxts
     功能描述：多个本地TXT文件入库
     接口描述： /api/txt/ addTxts
     传入参数：
     List<TxtAll>  txts；前端传入TxtAll列表的JSON对象
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    @Override
    public void addTxts(List<TxtAll> txtAllList) {
        if(txtAllList==null || txtAllList.size()==0)
            return;
        for(TxtAll txtAll: txtAllList)
            addTxt(txtAll);
    }

    /**
     服务编号：9003
     服务名称：addFromRawDB
     功能描述：从原始数据库中提取指定类型的图形文件入库
     接口描述： /api/txt/addFromRawDB
     传入参数：
     String txtType   图形类型，文件后缀；
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    @Override
    public boolean addFromRawDB() {
        return false;
    }

    /**
     服务编号：9004
     服务名称：getTxtByName
     功能描述：文本数据库中提取指定名称的文本文件
     接口描述： /api/txt/getTxtByName
     传入参数：
     String txtName   图形名称；
     返回值：
     List<TxtAll> txtAllList 的JSON字符串
     调用示例：
     */
    @Override
    public List<TxtAll> getTxtByName(String txtName) {
        return getTxtByEnTitle(txtName);
    }

    /**
     * 服务编号：9005
     * 服务名称：getTxtByEnTitle
     * 功能描述：图形数据库中提取指定英文名称的图形文件
     * 接口描述： /api/txt/getTxtByEnTitle
     * 传入参数：
     * String enTitle ；
     * 返回值：
     * List<TxtAll> txtAllList 的JSON字符串
     * 调用示例：
     *
     * @param txtEnTitle
     */
    @Override
    public List<TxtAll> getTxtByEnTitle(String txtEnTitle) {
        if(txtManager == null) txtManager = Managers.getTxtManager();
        return txtManager.queryByEnTitle(txtEnTitle);
    }

    /**
     * 服务编号：7007
     * 服务名称：getTxtByInternalId
     * 功能描述：图形数据库中提取指定ID的图形文件
     * 接口描述： /api/txt/getTxtByInternalId
     * 传入参数：
     * long internalId；
     * 返回值：
     * TxtAll  txt     ; TxtAll的JSON字符串
     * 调用示例：
     *
     * @param internalId
     */
    @Override
    public TxtAll getTxtByInternalId(BigDecimal internalId) {
        if(txtManager == null) txtManager = Managers.getTxtManager();
        return txtManager.queryByInternalId(internalId);
    }

    @Override
    public boolean deleteTxtByInternalId(BigDecimal internalId) {
        if(txtManager==null)
            txtManager = Managers.getTxtManager();
        TxtAll txtAll =new TxtAll();
        txtAll.setTxtInternalId(internalId);
        return txtManager.delete(txtAll);
    }

    @Override
    public List<TxtCatalog> getTxtCatalogs() {
        if(txtManager==null)
            txtManager=Managers.getTxtManager();
        return txtManager.getCatalogs();
    }

    @Override
    public Document getDocumentByTxtInternalId(BigDecimal txtInternalId) {
//        if(txtManager==null)
//            txtManager=Managers.getTxtManager();
//        BlockQuerier querier = txtManager.getBlockQuerier();
//        querier.selectByInternalId(txtInternalId);
//        Iterator<ShapeBlock> shapeBlocks = querier.iterator();
//        //only one
//        if(shapeBlocks.hasNext()) {
//            ShapeBlock shapeBlock = shapeBlocks.next();
//            Document document = TxtUtils.convert(shapeBlock.getTxtAll());
//            //fill feature geojson string into contents
//            FeatureQuerier featureQuerier = shapeBlock.getFeatureQuerier();
//            Document doc = document .toBuilder()
//                    .addAllContent(featureQuerier.getFeatureJSONs())
//                    .build();
//            return doc;
//        }
        return null;
    }

    @Override
    public List<TxtAll> getTxtByCatalogInternalId(BigDecimal catalogInternalId) {
        if(txtManager==null)
            txtManager=Managers.getTxtManager();
        try {
            Map<String,Object> p = new LinkedHashMap<String,Object>();
            p.put("txtCatalog",catalogInternalId);
            List<TxtAll> txtAllList = txtManager.query(p);
            return txtAllList;
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

//    @Override
//    public CatalogTree getCatalogTree() {
//        return null;
//    }

//    @Override
//    public CatalogTree getCatalogTree() {
//        if(txtManager==null)
//            txtManager=Managers.getTxtManager();
//        return txtManager.getCatalogTree();
//    }

    @Override
    public List<BigDecimal> getTxtInternalIdsByCatalogInternalId(BigDecimal catalogId) {
        if(txtManager==null)
            txtManager=Managers.getTxtManager();
        return txtManager.getTxtInternalIdsByCatalogInternalId(catalogId);
    }

    @Override
    public List<TxtAll> getTxtByCnTitle(String txtCnTitle) {
        if(txtManager==null)
            txtManager=Managers.getTxtManager();
        return txtManager.queryByComment(txtCnTitle);
    }


}
